package com.mc.common.redis;

import com.mc.common.exception.RedisException;

public interface RedisOperator<T> {
    /**
     * 根据名称、键、回调方法获取缓存
     *
     * @param key 键
     * @return 缓存值
     * @throws Exception 异常
     */
    T get(String key) throws RedisException, RedisException;

    /**
     * 根据名称、键、数据类型获取缓存
     *
     * @param key    键
     * @param expire 重设过期时间
     * @return 缓存值
     * @throws Exception 异常
     */
    T get(String key, int expire) throws RedisException;


    /**
     * 放入缓存
     *
     * @param key  键
     * @param data 数据
     */
    void put(String key, T data) throws RedisException;


    /**
     * 放入缓存
     *
     * @param key  键
     * @param data 数据
     */
    void put(String key, T data, int expire) throws RedisException;

    /**
     * 删除其中的一个key
     *
     * @param key 键
     */
    void del(String key) throws RedisException;

    /**
     * 分布式锁命令
     *
     * @param key
     * @param data
     * @param expireTime
     * @return
     */
    boolean setNx(String key, T data, Long expireTime);

    /**
     * 分布式锁
     *
     * @param key
     * @param waitTime   等待时间
     * @param expireTime 过期时间
     * @return
     */
    boolean lock(String key, Long waitTime, Long expireTime);

    /**
     * 释放锁
     *
     * @param key
     */
    void unLock(Object key);
}
